package boot

import (
	"fmt"
	"regexp"
	"strings"
	"yunj/pkg/global"
	"yunj/pkg/yunj/config"

	"github.com/lionsoul2014/ip2region/binding/golang/xdb"
)

// 初始化IP搜索
func InitIpSearcher() {
	var dbPath = "storage/libs/ip2region.xdb"

	// 1、从 dbPath 加载整个 xdb 到内存
	cBuff, err := xdb.LoadContentFromFile(dbPath)
	if err != nil {
		panic(fmt.Sprintf("IP搜索加载文件%s失败: %v", dbPath, err))
	}
	// 2、用全局的 cBuff 创建完全基于内存的查询对象。
	searcher, err := xdb.NewWithBuffer(cBuff)
	if err != nil {
		panic(fmt.Sprintf("IP搜索创建查询对象失败: %v", err))
	}

	global.IpSearcher = searcher

	// 编译省份正则表达式
	// 构建正则表达式模式：将所有省份名称用竖线连接
	// 例如："北京|天津|河北|..."
	var patterns []string
	// 对每个省份名称进行转义处理，防止包含正则特殊字符
	for _, p := range config.Provinces {
		patterns = append(patterns, regexp.QuoteMeta(p))
	}
	global.ProvinceRegexp = regexp.MustCompile(strings.Join(patterns, "|"))
	// 编译正则表达式
	re, err := regexp.Compile(strings.Join(patterns, "|"))
	if err != nil {
		panic(fmt.Sprintf("编译省份正则表达式失败: %v", err))
	}
	global.ProvinceRegexp = re
}
